package us.codecraft.webmagic.samples;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.util.JdbcUtil;
import us.codecraft.webmagic.vo.HongyeHouseVo;

/**
 * @details webmagic是一个开源的Java垂直爬虫框架，webmagic包含页面抽取功能，开发者可以使用css selector、xpath和正则表达式进行链接和内容的提取，支持多个选择器链式调用。
 * @progam:webmagic-develop
 * @author:GJS
 * @Time:2022/4/20 08:38
 */
public class SettledGuestProcessor implements PageProcessor {

    /**
     * 部分一：抓取网站的相关配置，包括编码、抓取间隔、重试次数等
     */
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);

    /**
     * 记录爬取的次数
     */
    private static int count = 0;

    /**
     * process是定制爬虫逻辑的核心接口，在这里编写抽取逻辑
     * @param page
     */
    @Override
    public void process(Page page) {
        // 部分二：定义如何抽取页面信息，并保存下来
        for (int i = 1; i <= 60; i++) {
            HongyeHouseVo vo = new HongyeHouseVo();
            //底层使用put方法存入
            page.putField("author", page.getUrl().regex("https://sh.fang.anjuke.com/loupan/all/").toString());
            //*[@id="container"]/div[2]/div[1]/div[3]/div[1]/div/a[1]/span
            //*[@id="container"]/div[2]/div[1]/div[3]/div[2]/div/a[1]/span
            page.putField("houseName", page.getHtml().xpath("//*[@id=\"container\"]/div[2]/div[1]/div[3]/div["+i+"]/div/a[1]/span/text()").toString());
            if (page.getResultItems().get("houseName") == null) {
                //skip this page
                page.setSkip(true);
            }

            page.putField("address", page.getHtml().xpath("//*[@id=\"container\"]/div[2]/div[1]/div[3]/div["+i+"]/div/a[2]/span/text()").toString());

            page.putField("price", page.getHtml().xpath("//*[@id=\"container\"]/div[2]/div[1]/div[3]/div["+i+"]/a[2]/p/span/text()").toString());

            String houseName = page.getResultItems().get("houseName");
            String address = page.getResultItems().get("address");
            String price = page.getResultItems().get("price");

            vo.setHouseName(houseName);
            vo.setAddress(address);

            //price为待定价等，设价格为0
            if (price!=null && !price.equals("0")){
                vo.setPrice(Double.parseDouble(price));
            }else {
                vo.setPrice(0d);
            }

            JdbcUtil.insertHouse(vo);
            count++;
        }
        // 部分三：从页面发现后续的url地址来抓取
        page.addTargetRequests(page.getHtml().links().regex("(https://sh.fang.anjuke.com/loupan/all/p2/)").all());
    }

    @Override
    public Site getSite() {
        return site;
    }

    public static void main(String[] args) {
        long startTime, endTime;
        System.out.println("开始爬取...");
        startTime = System.currentTimeMillis();
        Spider.create(new SettledGuestProcessor())
                //从"https://github.com/code4craft"开始抓
                .addUrl("https://sh.fang.anjuke.com/loupan/all/")
                //开启5个线程抓取
                .thread(1)
                //启动爬虫
                .run();

        endTime = System.currentTimeMillis();
        System.out.println("爬取结束，耗时约" + ((endTime - startTime) / 1000) + "秒，抓取了" + count + "条记录");
    };

}
